﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aribaccio
{
    /// <summary>
    /// 定义扩展bit与byte转换类
    /// </summary>
    public static class ExtendBitByte
    {
        /// <summary>
        /// 位转字节[手动方式]
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        public static byte ToByte(this bool[] argBits)
        {
            var bytes = GetBytesByManual(argBits);
            if (bytes == null || bytes.Length == 0) return default;
            return bytes[0];
        }

        /// <summary>
        /// 位转字节[BitArray方式]
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        public static byte ToArrayByte(this bool[] argBits)
        {
            var bytes = GetBytesByArray(argBits);
            if (bytes == null || bytes.Length == 0) return default;
            return bytes[0];
        }

        /// <summary>
        /// 位转字节[手动方式]
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        public static byte[] ToBytes(this bool[] argBits)
        {
            return GetBytesByManual(argBits);
        }

        /// <summary>
        /// 位转字节[BitArray方式]
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        public static byte[] ToArrayBytes(this bool[] argBits)
        {
            return GetBytesByArray(argBits);
        }


        /// <summary>
        /// 获取字节
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        private static byte[] GetBytesByManual(bool[] argBits)
        {
            if (argBits == null || argBits.Length == 0) return new byte[0];
            // 计算需要的byte数量
            int byteCount = (argBits.Length + 7) / 8;
            byte[] bytes = new byte[byteCount];
            // 设置数据
            for (int i = 0; i < argBits.Length; i++)
            {
                // 当前位的byte索引
                int byteIndex = i / 8;
                // 当前位在byte中的位置
                int bitIndex = i % 8;
                if (argBits[i])
                {
                    // 设置位
                    bytes[byteIndex] |= (byte)(1 << bitIndex);
                }
            }
            // 返回结果字节数组
            return bytes;
        }

        /// <summary>
        /// 获取字节
        /// </summary>
        /// <param name="argBits">bit数组（1:true, 0:false）</param>
        /// <returns></returns>
        private static byte[] GetBytesByArray(bool[] argBits)
        {
            if (argBits == null || argBits.Length == 0) return new byte[0];
            var bitArray = new BitArray(argBits);
            // 计算需要的字节数并初始化数组
            var bytes = new byte[(bitArray.Length + 7) / 8];
            // 将位数组复制到字节数组中
            bitArray.CopyTo(bytes, 0);
            // 返回结果字节数组
            return bytes;
        }
    }
}
